package br.com.sigeden.dao;

import br.com.sigeden.model.Autor;
import br.com.sigeden.model.Categoria;
import br.com.sigeden.model.Denuncia;
import br.com.sigeden.model.Entidade;
import br.com.sigeden.util.HibernateUtil;
import java.util.List;
import org.hibernate.Criteria;
import org.hibernate.Query;
import org.hibernate.Session;
import org.hibernate.Transaction;

/**
 *
 * @author David Amom <davidamom@gmail.com>
 */
public class DenunciaDAO {

    private Session sessao;
    private Transaction transacao;
    private List<Denuncia> denuncias;
    private Autor autor;
    private Entidade entidade;
    private Categoria categoria;

    public List<Denuncia> listarDenuncias() {
        sessao = HibernateUtil.getSessionFactory().openSession();

        Criteria criteria = sessao.createCriteria(Denuncia.class);
        this.denuncias = criteria.list();

        sessao.close();
        return denuncias;
    }

    public void adicionarDenuncia(Denuncia denuncia) {
        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();

            Denuncia d = new Denuncia();
            d.setAutor(denuncia.getAutor());
            d.setBoRegistrado(denuncia.getBoRegistrado());
            d.setTipoDenuncia(denuncia.getTipoDenuncia());
            d.setCategoria(denuncia.getCategoria());
            d.setSubcategoria("Subcategoria");

            denuncia.setCondicao("Criada");
            d.setCondicao(denuncia.getCondicao());
            d.setSexo(denuncia.getSexo());
            d.setAfirmacoes(0);
            d.setDataDenuncia(denuncia.getDataDenuncia());
            d.setDataCriacaoDenuncia(new java.util.Date());
            d.setDescricao(denuncia.getDescricao());
            d.setEndereco(denuncia.getEndereco());
            d.setEnvolvidos(null);
            d.setEntidade(denuncia.getEntidade());
            d.setLatitude(denuncia.getLatitude());
            d.setLongitude(denuncia.getLongitude());

            sessao.save(d);
            transacao.commit();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sessao.close();
        }
    }

    public void removerDenuncia(Denuncia denuncia) {
        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();

            sessao.delete(denuncia);

            transacao.commit();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sessao.close();
        }
    }

    public void atualizarDenuncia(Denuncia denuncia) {
        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();

            sessao.update(denuncia);

            transacao.commit();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sessao.close();
        }
    }

    public void incrementarAfirmacoes(Denuncia denuncia) {
        try {
            sessao = HibernateUtil.getSessionFactory().openSession();
            transacao = sessao.beginTransaction();
            
            Query query = sessao.createQuery("UPDATE Denuncia SET afirmacoes = afirmacoes + 1 WHERE id = :id");
            query.setParameter("id", denuncia.getId());
            query.executeUpdate();

            transacao.commit();

        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            sessao.close();
        }
    }
}
